home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / artemis1 / src / cmdmask.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-14  |  5.2 KB  |  257 lines

  1. /*
  2.     cmdmask.c
  3. */
  4.  
  5. #include <stdlib.h>
  6. #include <stdlib.h>
  7. #include <math.h>
  8.  
  9. #include "ge.h"
  10. #include "imageman.h"
  11. #include "dispman.h"
  12. #include "mask.h"
  13.  
  14. #define    MASKOFF        mask_setswitch(NO)
  15. #define    MASKON        mask_setswitch(YES)
  16.  
  17. #define    MASK_DEBUG 0
  18.  
  19. /*--------------------------------------------------------*/
  20. /*               マスクの反転表示・反転消去               */
  21. /*--------------------------------------------------------*/
  22.  
  23. static void erasemask(void)
  24. {
  25.     int xlen,ylen;
  26.     xlen = EIMgetxsize();
  27.     ylen = EIMgetysize();
  28.     int i;
  29.     mask_setswitch(YES);
  30.     for (i=0; i<ylen; i++)
  31.     {
  32.         int ix = 0;
  33.         while (ix < xlen)
  34.         {
  35.             int l = mask_chkxylen(ix,xlen-1,i,YES);
  36.             ix += l;
  37.             if (ix >= xlen)
  38.                 break;
  39.             l = mask_chkxylen(ix,xlen-1,i,NO);
  40.             if (l > 0)
  41.             {
  42.                 mask_setswitch(NO);
  43.                 EIMhline(ix,ix+l-1,i,white,DrawXOR);
  44.                 mask_setswitch(YES);
  45.             }
  46.             ix += l;
  47.         }
  48.     }
  49.     mask_setswitch(NO);
  50. }
  51.  
  52. static void dispmask(bool first)
  53. {
  54. #if MASK_DEBUG
  55.     first = YES;
  56. #endif
  57.     int xlen,ylen;
  58.     xlen = EIMgetxsize();
  59.     ylen = EIMgetysize();
  60.     int i;
  61.     mask_setswitch(YES);
  62.     for (i=0; i<ylen; i++)
  63.     {
  64.         int ix = 0;
  65.         while (ix < xlen)
  66.         {
  67.             int ix2;
  68.             int l = mask_chkxylen(ix,xlen-1,i,YES);
  69.             if (!first && l > 0)
  70.             {
  71.                 ix2 = ix;
  72.                 while (ix2 < ix+l)
  73.                 {
  74.                     int l2 = mask_chkxylen_back(ix2,ix+l-1,i,YES);
  75.                     ix2 += l2;
  76.                     l2 = mask_chkxylen_back(ix2,ix+l-1,i,NO);
  77.                     if (l2 > 0)
  78.                       {MASKOFF;EIMhline(ix2,ix2+l2-1,i,white,DrawXOR);MASKON;}
  79.                     ix2 += l2;
  80.                 }
  81.             }
  82.             ix += l;
  83.             if (ix >= xlen)
  84.                 break;
  85.             l = mask_chkxylen(ix,xlen-1,i,NO);
  86.             if (first)
  87.             {
  88.                 MASKOFF;  EIMhline(ix,ix+l-1,i,white,DrawXOR);  MASKON;
  89.             }
  90.             else if (l > 0)
  91.             {
  92.                 ix2 = ix;
  93.                 while (ix2 < ix+l)
  94.                 {
  95.                     int l2 = mask_chkxylen_back(ix2,ix+l-1,i,YES);
  96.                     if (l2 > 0)
  97.                       {MASKOFF;EIMhline(ix2,ix2+l2-1,i,white,DrawXOR);MASKON;}
  98.                     ix2 += l2;
  99.                     l2 = mask_chkxylen_back(ix2,ix+l-1,i,NO);
  100.                     ix2 += l2;
  101.                 }
  102.             }
  103.             ix += l;
  104.         }
  105.     }
  106.     mask_setswitch(NO);
  107. }
  108.  
  109. /*--------------------------------------------------------*/
  110. /*       領域指定によるマスクのセット・クリア・反転       */
  111. /*--------------------------------------------------------*/
  112.  
  113. static void area_mask(int type)
  114. // type 0,1,2: それぞれセット、クリア、反転
  115. {
  116.     for (;;)
  117.     {
  118.         if (area_input(AREA_POLYGON) != 0)
  119.             break;
  120. #if MASK_DEBUG
  121.         erasemask();
  122. #endif
  123.         mask_backup();
  124.         int ax1,ay1,ax2,ay2;
  125.         area_getboundxy(&ax1,&ay1,&ax2,&ay2);
  126.         int x,y;
  127.         ax1 = _lim(ax1, 0, EIMgetxsize());
  128.         ax2 = _lim(ax2, 0, EIMgetxsize());
  129.         ay1 = _lim(ay1, 0, EIMgetysize());
  130.         ay2 = _lim(ay2, 0, EIMgetysize());
  131.         for (y=ay1; y<=ay2; y++)
  132.         {
  133.             x = ax1 + area_chkxylen(ax1,ax2,y,YES);
  134.             while (x<=ax2)
  135.             {
  136.                 int l;
  137.                 if ((l = area_chkxylen(x,ax2,y,NO)) == 0)
  138.                     break;
  139.                 mask_hline(x,x+l-1,y, type);
  140.                 x += l + area_chkxylen(x+l,ax2,y,YES);
  141.             }
  142.         }
  143.         dispmask(NO);
  144.     }
  145. }
  146.  
  147. /*--------------------------------------------------------*/
  148. /*           全体指定によるマスクのクリア・反転           */
  149. /*--------------------------------------------------------*/
  150.  
  151. static void all_mask(int type)
  152. // type 0,1,2: それぞれセット、クリア、反転
  153. {
  154.     int i,xlen,ylen;
  155. #if MASK_DEBUG
  156.         erasemask();
  157. #endif
  158.     mask_backup();
  159.     xlen = EIMgetxsize();
  160.     ylen = EIMgetysize();
  161.     for (i=0; i<ylen; i++)
  162.         mask_hline(0,xlen-1,i, type);
  163.     dispmask(NO);
  164. }
  165.  
  166. /*--------------------------------------------------------*/
  167. /*                マスク指定メニューの定義                */
  168. /*--------------------------------------------------------*/
  169.  
  170. #define    MYLEN    160
  171.  
  172. /*
  173. #define    itemSetMask        2
  174. #define    itemClrMask        3
  175. #define    itemXchgMask    4
  176. #define    itemAllXchgMask    5
  177. #define    itemAllClrMask    6
  178. */
  179.  
  180. #include "cmdmask.md"
  181.  
  182. void commandMask()
  183. {
  184.     // #define    SELPARA(n)        (maskmenu_sels[n].var)
  185.     menu_selector_setvar(menu_selector(&maskmenu,selID0),
  186.                          (mask_getswitch() ? 1 : 0));
  187.     mask_setswitch(NO);
  188.     dispmask(YES);
  189.     menu_disp(&maskmenu);
  190.     for (;;)
  191.     {
  192.         DMdispcsr(ms.x,ms.y);
  193.         for (;;)
  194.         {
  195.             ms_get(&ms);
  196.             if (ms.dx!=0||ms.dy!=0||ms.btn1!=OFF||ms.btn2!=OFF||key_chk()!=0)
  197.                 break;
  198.         }
  199.         DMerasecsr();
  200.         scrollForCsr(1,1);
  201.         if (ms.btn1 == OFFON)
  202.         {
  203.             int a;
  204.             a = menu_where(ms.x,ms.y,&maskmenu, NULL,NULL,NULL);
  205.             switch (a)
  206.             {
  207.             case itemSetMask:
  208.                 menu_erase();
  209.                 area_mask(0);
  210.                 menu_disp(&maskmenu);
  211.                 break;
  212.             case itemClrMask:
  213.                 menu_erase();
  214.                 area_mask(1);
  215.                 menu_disp(&maskmenu);
  216.                 break;
  217.             case itemXchgMask:
  218.                 menu_erase();
  219.                 area_mask(2);
  220.                 menu_disp(&maskmenu);
  221.                 break;
  222.             case itemAllXchgMask:
  223.                 menu_erase();
  224.                 all_mask(2);
  225.                 menu_disp(&maskmenu);
  226.                 break;
  227.             case itemAllClrMask:
  228.                 if (check_yes_no("マスクの設定を全部消去します。よろしいですか?") == 0)
  229.                 {
  230.                     menu_erase();
  231.                     all_mask(1);
  232.                 }
  233.                 else
  234.                     menu_erase();
  235.                 menu_disp(&maskmenu);
  236.                 break;
  237.             case itemMoveMenu:
  238.                 menu_move();
  239.                 break;
  240.             case itemSelector:
  241.                 menu_touchselector(&maskmenu);
  242.                 break;
  243.             }
  244.         }
  245.         if (ms.btn2 == OFFON)
  246.             break;
  247.     }
  248. exitloop:
  249.     menu_erase();
  250. end:
  251.     erasemask();
  252.     mask_setswitch(
  253.         menu_selector_getvar(menu_selector(&maskmenu,selID0)) == 0 ?
  254.         NO : YES);
  255.     return;
  256. }
  257.